package com.black.utils.config.loader;

import com.alibaba.fastjson2.JSONObject;
import com.black.utils.file.FileTypeEnum;

import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Properties;

/**
 * Loads configuration from properties file and converts it to JSON format.
 * 从属性文件加载配置，并将其转换为JSON格式。
 *
 * @author ylx
 */
public class PropertiesLoader extends Loader {

    /**
     * Loads configuration from a properties file and converts it to a JSON object.
     * 从属性文件加载配置，并转换为JSON对象。
     *
     * @param sourcePath The path to the properties file.
     *                   属性文件的路径。
     * @return The JSON object representing the loaded configuration.
     * 表示加载配置的JSON对象。
     * @throws IOException If an error occurs while loading the properties file.
     *                     加载属性文件时发生错误。
     */
    @Override
    public JSONObject loadJsonConfig(String sourcePath) throws IOException {
        Properties properties = new Properties();
        InputStream stream = this.getClass().getResourceAsStream(sourcePath);
        properties.load(stream);
        JSONObject config = new JSONObject();
        properties.forEach((k, v) -> config.put(k.toString(), v));
        stream.close();
        return config;
    }

    @Override
    public List<FileTypeEnum> getTypes() {
        return Collections.singletonList(FileTypeEnum.PROPERTIES);
    }

    /**
     * Utility method to load a configuration object from a properties file.
     * 实用方法，从属性文件加载配置对象。
     *
     * @param <T>        The type of the target configuration object.
     *                   目标配置对象的类型。
     * @param sourcePath The path to the properties file.
     *                   属性文件的路径。
     * @param target     The class type of the target configuration object.
     *                   目标配置对象的类类型。
     * @return The loaded configuration object.
     * 加载的配置对象。
     * @throws IOException If an error occurs while loading the properties file.
     *                     加载属性文件时发生错误。
     */
    public static <T> T loadConfig(String sourcePath, Class<T> target) throws IOException {
        return new PropertiesLoader().loadConfigObject(sourcePath, target);
    }
}
